# 访问者模式

# 将算法与对象结构分离，使得算法可以独立于对象结构而变化。

# 角色
# 访问者: 定义了一个访问者接口，用于访问元素对象
# 具体访问者: 实现了访问者接口，定义了具体的访问算法
# 元素: 定义了一个元素接口，用于接受访问者
# 具体元素: 实现了元素接口，定义了具体的元素对象

from abc import ABCMeta, abstractmethod
class Visitor(metaclass=ABCMeta):
    @abstractmethod
    def visit(self, element):
        pass

class ConcreteVisitor(Visitor):
    def visit(self, element):
        print("ConcreteVisitor visit", element)

class Element(metaclass=ABCMeta):
    @abstractmethod
    def accept(self, visitor):
        pass

class ConcreteElement(Element):
    def accept(self, visitor):
        visitor.visit(self)

if __name__ == "__main__":
    element = ConcreteElement()
    visitor = ConcreteVisitor()
    element.accept(visitor)
